package pers.cj.pdos.mapper;

import org.apache.ibatis.annotations.Param;
import pers.cj.pdos.entity.Goods;
import pers.cj.pdos.entity.GoodsSn;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import pers.cj.pdos.vo.GoodsSnVo;
import pers.cj.pdos.vo.JoinSplitNewGoodsVo;
import pers.cj.pdos.vo.JoinSplitOldGoodsVo;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 商品启用sn后:入库时需要与商品1对1入库。出库时也需要一对一出库 Mapper 接口
 * </p>
 *
 * @author chenj
 * @since 2019-11-04
 */
public interface GoodsSnMapper extends BaseMapper<GoodsSn> {

    List<GoodsSnVo> listVoPage(@Param("companyId") String companyId,
                               @Param("page") Integer page,
                               @Param("limit")Integer limit,
                               @Param("search") String search,
                               @Param("storeId") String storeId,
                               @Param("houseId") String houseId,
                               @Param("inDate1")Date inDate1,
                               @Param("inDate2")Date inDate2,
                               @Param("outDate1")Date outDate1,
                               @Param("outDate2")Date outDate2,
                               @Param("sn") String sn,
                               @Param("status") Integer status,
                               @Param("no") String no,
                               @Param("name") String name);

    Long count(@Param("companyId") String companyId,
               @Param("search") String search,
               @Param("storeId") String storeId,
               @Param("houseId") String houseId,
               @Param("inDate1")Date inDate1,
               @Param("inDate2")Date inDate2,
               @Param("outDate1")Date outDate1,
               @Param("outDate2")Date outDate2,
               @Param("sn") String sn,
               @Param("status") Integer status,
               @Param("no") String no,
               @Param("name") String name);

    /**
     * 批量插入数据
     *
     * @param list
     */
    void insertBatch(@Param("list")List<GoodsSn> list);



    GoodsSnVo getVoById(@Param("id")String id);

    /**
     * 检查在库的sn中是否有sns中的数据
     * @param sns
     * @return
     */
    Long countRepeat(@Param("goodsId") String goodsId, @Param("sns")List<String> sns);

    /**
     * 检查sns中，是否有除houseId以外的sn在库
     * @param sns
     * @return
     */
    List<GoodsSn> checkSnStatusOutHouseId(@Param("goodsId") String goodsId, @Param("houseId") String houseId, @Param("sns")List<String> sns);


    /**
     * 根据map入库sn
     * @param list
     */
    void inByList(@Param("houseId") String houseId,@Param("list")List<GoodsSn> list);

    /**
     * 根据map出库sn
     * @param list
     */
    void outByList(@Param("houseId") String houseId,@Param("list")List<GoodsSn> list);

    /**
     * 遍历已出库,并且在库的序列号
     * @param houseId
     * @return
     */
    List<GoodsSn> listOut(@Param("page")Integer page, @Param("limit")Integer limit, @Param("goodsId") String goodsId, @Param("houseId")String houseId,@Param("search")String search);
    /**
     * 遍历已出库,并且在库的序列号
     * @param houseId
     * @return
     */
    Long countOut(@Param("goodsId") String goodsId,@Param("houseId")String houseId,@Param("search")String search);

    /**
     * 根据调拨单id遍历出不在库的sn
     * @param goodsTransferId
     * @return
     */
    List<GoodsSn> listOutByGoodsTransferId(@Param("goodsTransferId")String goodsTransferId, @Param("goodsId")String goodsId);

    void batchDeleteByGoodsList(@Param("list") List<Goods> list);

    /**
     * 根据借入单id查找goodsId商品的sn号， 其中排除了已被转进货的sn(borrow=1)
     * @param borrowInId
     * @param goodsId
     * @return
     */
    List<GoodsSn> listOutByBorrowInId(@Param("borrowInId") String borrowInId, @Param("goodsId") String goodsId);

    /**
     * 根据借出单id查找goodsId商品的sn号， 其中排除了已被转销售的sn(borrow=1)
     * @param borrowOutId
     * @param goodsId
     * @return
     */
    List<GoodsSn> listOutByBorrowOutId( @Param("borrowOutId")String borrowOutId, @Param("goodsId") String goodsId);
}
